/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ws.converter;

import entidade.persistencia.Venda;
import java.net.URI;
import java.util.Date;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlAttribute;
import javax.ws.rs.core.UriBuilder;
import javax.persistence.EntityManager;
import entidade.persistencia.ProdutoVenda;
import entidade.persistencia.Funcionario;
import entidade.persistencia.EntradaSaida;
import entidade.persistencia.Usuario;
import java.util.Collection;
import java.util.List;

/**
 *
 * @author victorinox
 */

@XmlRootElement(name = "venda")
public class VendaConverter {
    private Venda entity;
    private URI uri;
    private int expandLevel;
  
    /** Creates a new instance of VendaConverter */
    public VendaConverter() {
        entity = new Venda();
    }

    /**
     * Creates a new instance of VendaConverter.
     *
     * @param entity associated entity
     * @param uri associated uri
     * @param expandLevel indicates the number of levels the entity graph should be expanded@param isUriExtendable indicates whether the uri can be extended
     */
    public VendaConverter(Venda entity, URI uri, int expandLevel, boolean isUriExtendable) {
        this.entity = entity;
        this.uri = (isUriExtendable) ? UriBuilder.fromUri(uri).path(entity.getVendaId() + "/").build() : uri;
        this.expandLevel = expandLevel;
        getEntradaSaidaCollection();
        getProdutoVendaCollection();
        getFuncionarioId();
        getClienteId();
        getTransportadorId();
    }

    /**
     * Creates a new instance of VendaConverter.
     *
     * @param entity associated entity
     * @param uri associated uri
     * @param expandLevel indicates the number of levels the entity graph should be expanded
     */
    public VendaConverter(Venda entity, URI uri, int expandLevel) {
        this(entity, uri, expandLevel, false);
    }

    /**
     * Getter for vendaId.
     *
     * @return value for vendaId
     */
    @XmlElement
    public Integer getVendaId() {
        return (expandLevel > 0) ? entity.getVendaId() : null;
    }

    /**
     * Setter for vendaId.
     *
     * @param value the value to set
     */
    public void setVendaId(Integer value) {
        entity.setVendaId(value);
    }

    /**
     * Getter for observacao.
     *
     * @return value for observacao
     */
    @XmlElement
    public String getObservacao() {
        return (expandLevel > 0) ? entity.getObservacao() : null;
    }

    /**
     * Setter for observacao.
     *
     * @param value the value to set
     */
    public void setObservacao(String value) {
        entity.setObservacao(value);
    }

    /**
     * Getter for dataVenda.
     *
     * @return value for dataVenda
     */
    @XmlElement
    public Date getDataVenda() {
        return (expandLevel > 0) ? entity.getDataVenda() : null;
    }

    /**
     * Setter for dataVenda.
     *
     * @param value the value to set
     */
    public void setDataVenda(Date value) {
        entity.setDataVenda(value);
    }

    /**
     * Getter for dataEntrega.
     *
     * @return value for dataEntrega
     */
    @XmlElement
    public Date getDataEntrega() {
        return (expandLevel > 0) ? entity.getDataEntrega() : null;
    }

    /**
     * Setter for dataEntrega.
     *
     * @param value the value to set
     */
    public void setDataEntrega(Date value) {
        entity.setDataEntrega(value);
    }

    /**
     * Getter for dataPagamento.
     *
     * @return value for dataPagamento
     */
    @XmlElement
    public Date getDataPagamento() {
        return (expandLevel > 0) ? entity.getDataPagamento() : null;
    }

    /**
     * Setter for dataPagamento.
     *
     * @param value the value to set
     */
    public void setDataPagamento(Date value) {
        entity.setDataPagamento(value);
    }

    /**
     * Getter for valorTransporte.
     *
     * @return value for valorTransporte
     */
    @XmlElement
    public Float getValorTransporte() {
        return (expandLevel > 0) ? entity.getValorTransporte() : null;
    }

    /**
     * Setter for valorTransporte.
     *
     * @param value the value to set
     */
    public void setValorTransporte(Float value) {
        entity.setValorTransporte(value);
    }

    /**
     * Getter for seguroTransporte.
     *
     * @return value for seguroTransporte
     */
    @XmlElement
    public Float getSeguroTransporte() {
        return (expandLevel > 0) ? entity.getSeguroTransporte() : null;
    }

    /**
     * Setter for seguroTransporte.
     *
     * @param value the value to set
     */
    public void setSeguroTransporte(Float value) {
        entity.setSeguroTransporte(value);
    }

    /**
     * Getter for entradaSaidaCollection.
     *
     * @return value for entradaSaidaCollection
     */
    @XmlElement
    public EntradaSaidasConverter getEntradaSaidaCollection() {
        if (expandLevel > 0) {
            if (entity.getEntradaSaidaCollection() != null) {
                return new EntradaSaidasConverter(entity.getEntradaSaidaCollection(), uri.resolve("entradaSaidaCollection/"), expandLevel - 1);
            }
        }
        return null;
    }

    /**
     * Setter for entradaSaidaCollection.
     *
     * @param value the value to set
     */
    public void setEntradaSaidaCollection(EntradaSaidasConverter value) {
        entity.setEntradaSaidaCollection((value != null) ? value.getEntities() : null);
    }

    /**
     * Getter for produtoVendaCollection.
     *
     * @return value for produtoVendaCollection
     */
    @XmlElement
    public ProdutoVendasConverter getProdutoVendaCollection() {
        if (expandLevel > 0) {
            if (entity.getProdutoVendaCollection() != null) {
                return new ProdutoVendasConverter(entity.getProdutoVendaCollection(), uri.resolve("produtoVendaCollection/"), expandLevel - 1);
            }
        }
        return null;
    }

    /**
     * Setter for produtoVendaCollection.
     *
     * @param value the value to set
     */
    public void setProdutoVendaCollection(ProdutoVendasConverter value) {
        entity.setProdutoVendaCollection((value != null) ? value.getEntities() : null);
    }

    /**
     * Getter for funcionarioId.
     *
     * @return value for funcionarioId
     */
    @XmlElement
    public FuncionarioConverter getFuncionarioId() {
        if (expandLevel > 0) {
            if (entity.getFuncionarioId() != null) {
                return new FuncionarioConverter(entity.getFuncionarioId(), uri.resolve("funcionarioId/"), expandLevel - 1, false);
            }
        }
        return null;
    }

    /**
     * Setter for funcionarioId.
     *
     * @param value the value to set
     */
    public void setFuncionarioId(FuncionarioConverter value) {
        entity.setFuncionarioId((value != null) ? value.getEntity() : null);
    }

    /**
     * Getter for clienteId.
     *
     * @return value for clienteId
     */
    @XmlElement
    public UsuarioConverter getClienteId() {
        if (expandLevel > 0) {
            if (entity.getClienteId() != null) {
                return new UsuarioConverter(entity.getClienteId(), uri.resolve("clienteId/"), expandLevel - 1, false);
            }
        }
        return null;
    }

    /**
     * Setter for clienteId.
     *
     * @param value the value to set
     */
    public void setClienteId(UsuarioConverter value) {
        entity.setClienteId((value != null) ? value.getEntity() : null);
    }

    /**
     * Getter for transportadorId.
     *
     * @return value for transportadorId
     */
    @XmlElement
    public UsuarioConverter getTransportadorId() {
        if (expandLevel > 0) {
            if (entity.getTransportadorId() != null) {
                return new UsuarioConverter(entity.getTransportadorId(), uri.resolve("transportadorId/"), expandLevel - 1, false);
            }
        }
        return null;
    }

    /**
     * Setter for transportadorId.
     *
     * @param value the value to set
     */
    public void setTransportadorId(UsuarioConverter value) {
        entity.setTransportadorId((value != null) ? value.getEntity() : null);
    }

    /**
     * Returns the URI associated with this converter.
     *
     * @return the uri
     */
    @XmlAttribute
    public URI getUri() {
        return uri;
    }

    /**
     * Sets the URI for this reference converter.
     *
     */
    public void setUri(URI uri) {
        this.uri = uri;
    }

    /**
     * Returns the Venda entity.
     *
     * @return an entity
     */
    @XmlTransient
    public Venda getEntity() {
        if (entity.getVendaId() == null) {
            VendaConverter converter = UriResolver.getInstance().resolve(VendaConverter.class, uri);
            if (converter != null) {
                entity = converter.getEntity();
            }
        }
        return entity;
    }

    /**
     * Returns the resolved Venda entity.
     *
     * @return an resolved entity
     */
    public Venda resolveEntity(EntityManager em) {
        List<EntradaSaida> entradaSaidaCollection = entity.getEntradaSaidaCollection();
        List<EntradaSaida> newentradaSaidaCollection = new java.util.ArrayList<EntradaSaida>();
        for (EntradaSaida item : entradaSaidaCollection) {
            newentradaSaidaCollection.add(em.getReference(EntradaSaida.class, item.getEntradaSaidaId()));
        }
        entity.setEntradaSaidaCollection(newentradaSaidaCollection);
        List<ProdutoVenda> produtoVendaCollection = entity.getProdutoVendaCollection();
        List<ProdutoVenda> newprodutoVendaCollection = new java.util.ArrayList<ProdutoVenda>();
        for (ProdutoVenda item : produtoVendaCollection) {
            newprodutoVendaCollection.add(em.getReference(ProdutoVenda.class, item.getProdutoVendaPK()));
        }
        entity.setProdutoVendaCollection(newprodutoVendaCollection);
        Funcionario funcionarioId = entity.getFuncionarioId();
        if (funcionarioId != null) {
            entity.setFuncionarioId(em.getReference(Funcionario.class, funcionarioId.getFuncionarioId()));
        }
        Usuario clienteId = entity.getClienteId();
        if (clienteId != null) {
            entity.setClienteId(em.getReference(Usuario.class, clienteId.getUsuarioId()));
        }
        Usuario transportadorId = entity.getTransportadorId();
        if (transportadorId != null) {
            entity.setTransportadorId(em.getReference(Usuario.class, transportadorId.getUsuarioId()));
        }
        return entity;
    }
}
